package com.cos.shop.services.impl;

import com.cos.shop.common.Const;
import com.cos.shop.common.ResponseResult;
import com.cos.shop.dao.CartDao;
import com.cos.shop.dao.ItemDao;
import com.cos.shop.dao.OrderDao;
import com.cos.shop.dao.impl.CartDaoImpl;
import com.cos.shop.dao.impl.ItemDaoImpl;
import com.cos.shop.dao.impl.OrderDaoImpl;
import com.cos.shop.entity.Item;
import com.cos.shop.entity.Orders;
import com.cos.shop.services.OrderServices;
import com.cos.shop.util.DBUtils;
import com.cos.shop.util.RandomUtils;
import com.cos.shop.util.StringUtils;
import com.cos.shop.vo.CartVo;
import com.cos.shop.vo.OrderDetailVo;

import java.sql.SQLException;
import java.util.*;
import java.util.stream.Stream;

/**
 * @author: COS
 * @time: 2023/5/12 9:23
 * @description:
 */
public class OrderServicesImpl implements OrderServices {
    private OrderDao od = new OrderDaoImpl();
    private CartDao cd = new CartDaoImpl();
    private ItemDao id = new ItemDaoImpl();

    @Override
    public void changeStatusToPay(String outTradeNo) {
        try {
            // 判断这个支付宝的订购单是不是我们系统的订单, 金额是否正确正常
            // 各种判断 用户订单是否已支付状态, 有没有这个单订单号存在
            if (StringUtils.isNotEmpty(outTradeNo)) {
                //1 使用oid 查询订单数据是否存在
                Orders order = od.getOrrderByOid(outTradeNo);
                //2 判断
                if (order == null) {
                    return;
                }
                //3 判断订单状态
                if (order.getOstate() != Const.OrderState.NOT_PAY) {
                    //商品订单不是已发货的状态,不能修改状态为已收货
                    return;
                }
                //4 订单状态是已发送, 修改状态为收货
                int i = od.changeStatus(Const.OrderState.PAY, outTradeNo);
                //5 给出正常响应
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public ResponseResult changeStatus(String oid) {
        try {
            if (StringUtils.isNotEmpty(oid)) {
                //1 使用oid 查询订单数据是否存在
                Orders order = od.getOrrderByOid(oid);
                //2 判断
                if (order == null) {
                    return ResponseResult.createFail("该订单不存在,请重新再试或联系管理员");
                }
                //3 判断订单状态
                if (order.getOstate() != Const.OrderState.SEND) {
                    //商品订单不是已发货的状态,不能修改状态为已收货
                    return ResponseResult.createFail("该订单为发货,或者已收货了,请联系商家确认");
                }
                //4 订单状态是已发送, 修改状态为收货
                int i = od.changeStatus(Const.OrderState.RECEIVE, oid);
                //5 给出正常响应
                if (i > 0) {
                    return ResponseResult.createSuccess("订单已收货");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("收货失败,请稍后再试");
    }

    @Override
    public OrderDetailVo getOrderDetail(String oid) {
        try {
            if (StringUtils.isNotEmpty(oid)) {
                return od.getOrderDetail(oid);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public ResponseResult getOrderList(int uid) {
        try {
            if (uid > 0) {
                return ResponseResult.createSuccess(od.getOrderList(uid));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseResult.createFail("获取失败");
    }

    @Override
    public ResponseResult addOrder(int aid, int uid) {
        try {
            DBUtils.begin();
            //1 创建order对象
            Orders o = new Orders();
            // 设置order属性参数
            o.setOid(RandomUtils.createOrderId());
            o.setAid(aid);
            o.setUid(uid);
            o.setOtime(new Date());
            // 设置未支付状态
            o.setOstate(Const.OrderState.NOT_PAY);
            //2 使用uid 查询gouwuc
            List<CartVo> cartList = cd.getCartWithProByUid(uid);
            //3 创建Item 集合 转存数据使用
            List<Item> itemList = new ArrayList<>();
            //4 遍历购物车列表
            double sum = 0;
            for (CartVo cartVo : cartList) {
                //4.1 计算总价格  购物车小计累加
                sum += cartVo.getCcount();
                //4.2 创建item转存购物车数据
                Item i = new Item();
                i.setOid(o.getOid());
                i.setPid(cartVo.getPid());
                i.setInum(cartVo.getCnum());
                i.setIcount(cartVo.getCcount());
                // 加入list
                itemList.add(i);
            }
            //5 设置总金额到order
            o.setOcount(sum);
            //6 新增order数据
            od.addOrder(o);
            //7 新增item数据
            Object[][] args = new Object[itemList.size()][];
            //手动转二维数组
            for (int i = 0; i < args.length; i++) {
                Item item = itemList.get(i);
                args[i] = new Object[]{item.getOid(), item.getPid(), item.getIcount(), item.getInum()};
            }
            //  8 批量新增item fore //创建多次数据库链接
            id.addItem(args);
            //9 清空购物车
            cd.clearCart(uid);
            DBUtils.commit();
            return ResponseResult.createSuccess(o);
        } catch (SQLException e) {
            e.printStackTrace();
            DBUtils.rollback();
        }
        return ResponseResult.createFail("订单创建失败,请稍后再试");
    }


}
